﻿/*
# -*- coding: utf-8 -*-
# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

 */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

	[SerializeField]Rigidbody2D playerBody;
	[SerializeField]Animator animator;
	[SerializeField]Transform groundedCheck;
	//[SerializeField]GameObject deadParticle;
	[SerializeField]GameObject playerDisplay;

	[SerializeField] float speed;

	bool isMoving;
	bool isJumping;
	bool isGrounded;
	bool isTocBien = false;


	float groundedRadius = 0.01f;
	float grafitiModifier = 0;
	float speedOFfset = 1;
	float timer=0;

	int layerMask;
	int jumpForce = 500;
	int jumpCount = 0;

	Vector3 startPos;
	private void Start()
	{
		layerMask = LayerMask.GetMask ("ground");
		startPos = transform.position;
	}

	public void Wait()
	{
		isMoving = false;
		isJumping = false;
		playerBody.isKinematic = true;
		playerDisplay.SetActive (false);
		transform.position = startPos;
	}
	public void Play()
	{
		jumpCount = 0;
		playerDisplay.transform.localEulerAngles = Vector3.zero;
		playerBody.isKinematic = false;
		playerDisplay.SetActive (true);
	}

	public void TocBien(bool stage)
	{
//		playerBody.isKinematic = stage;
		if (stage) {
			playerBody.gravityScale = 0;
			speedOFfset = 3;
		} else {
			playerBody.gravityScale = 3;
			speedOFfset = 1;
		}
	}

	private void Update()
	{
		if (!GameController.IsPlaying)
			return;
		Grounded ();
		KeyBoardController ();
		Move ();
	}
	private void DelayStopTocBien()
	{
		isTocBien = false;
	}
	private float tempY;
	private void KeyBoardController()
	{
		if (Input.GetKeyDown (KeyCode.RightArrow)) {
			StartMoveControl ();
		}
		if (Input.GetKeyDown (KeyCode.LeftArrow)) {
			if (isJumping)
				return;
			isMoving = false;
			animator.Play("idle");
		}
		if (Input.GetKeyDown (KeyCode.UpArrow)) {
			Jump ();
		}
		if (Input.GetKeyDown (KeyCode.DownArrow)) {
			Slice ();
		}
		if (Input.GetKeyDown (KeyCode.LeftArrow)) {
			isTocBien = false;
			CancelInvoke ("DelayStopTocBien");
		}
	}
	public void Walk()
	{
		StartMoveControl ();
	}
	private void StartMoveControl()
	{
		isMoving = true;
		animator.Play ("walk");
		if(!isGrounded)
		{
			isTocBien = true;
			Invoke ("DelayStopTocBien", 1f);
			tempY = transform.position.y;
		}
	}
	public void Idle()
	{
		if (isJumping)
			return;
		isMoving = false;
		animator.Play("idle");
	}
	public void JumpInput()
	{
		Jump ();
	}
	public void SlideInput()
	{
		Slice ();
	}
	[HideInInspector]
	public bool isSlicing;
	private void Slice()
	{
		if (!isMoving)
			return;
		if (!isGrounded)
			return;
		isSlicing = true;
		animator.Play("slice");
		Invoke ("StopSlice", 1);
	}
	private void StopSlice()
	{
		isSlicing = false;
	}
	private void Move()
	{
		if (!isMoving)
			return;
		if (!isTocBien) {
			playerBody.gravityScale = 3;
			transform.Translate (Vector2.right * speed * 60 * Time.deltaTime);
		} else {
			playerBody.gravityScale = 0;
			transform.Translate (Vector2.right * speed *2* 60 * Time.deltaTime);
			transform.position = new Vector3 (transform.position.x, tempY, transform.position.z);
		}
		
	}
	private void Jump()
	{
//		if (!isMoving)
//			return;
		if (jumpCount == 0) {
			if (!isGrounded) {
				return;
			}
		}
		if (jumpCount == 2) {
			jumpCount = 0;
			return;
		}
		if (isSlicing)
			isSlicing = false;
		jumpCount++;
		isJumping = true;
		isMoving = true;
		Invoke ("JumpAni", 0.1f);
		playerBody.AddForce (new Vector2 (playerBody.velocity.x, jumpForce));
		MusicController.PlayClip (Random.Range(3,5));
	}
	private void JumpAni()
	{
		animator.Play("jump");
	}
	private void Grounded()
	{
		isGrounded = Physics2D.OverlapCircle (groundedCheck.position, groundedRadius, layerMask);
		if (isGrounded) {
			if (!isMoving || isSlicing)
				return;
			jumpCount = 0;
			isJumping = false;
			animator.Play ("walk");
		}
	}
	public void Die()
	{
		isMoving = false;
		isJumping = false;
		//deadParticle.Spawn (new Vector3 (transform.position.x, transform.position.y + 1, transform.position.z));
		playerDisplay.SetActive (false);
	}
	public void Respawn(float delay)
	{
		Invoke ("Respawn", delay);
	}
	private void Respawn()
	{
		GameController.gameStage = GameStage.PLAY;
		transform.position = startPos;
		transform.eulerAngles = Vector3.zero;
		playerDisplay.transform.localEulerAngles = Vector3.zero;
		playerDisplay.SetActive (true);
	}
	public void RespawnEnless()
	{
		transform.position = startPos;
		Idle ();
	}
	iCharacterCollision charCollision;
	iDame dame;
	private void OnTriggerEnter2D(Collider2D col)
	{
		charCollision = col.GetComponent<iCharacterCollision> ();
		if (charCollision != null) {
			TocBien (false);
			charCollision.CharCollision ();
		}
		dame = col.GetComponent<iDame> ();
	}
	private void OnTriggerStay2D(Collider2D col)
	{
		if (dame == null)
			return;
		if (!isSlicing && charCollision!=null)
			charCollision.CharCollision ();
	}
	private void OnTriggerExit2D(Collider2D col)
	{
		charCollision = null;
	}
}
